home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
t_os
/
kankyou
/
kankyou.doc
< prev
next >
Wrap
Text File
|
1993-11-30
|
8KB
|
163 lines
T-OS V2.1環境を改善するプログラム By Jouji
★CHGCONT.COM,INTD9.COMについて
私はUXユーザーですが、GNU-CD Rel.2を手に入れ、開発環境を整え
ようと増設RAMを買いました。スロットが1つしか無いので、奮発して8MByt
eのを買いました。そこで、RAMディスクを6MByte設定しているわけです。
私は、普段はTUGiを使うことが多いので、RAMディスク上にTUGiを転送
して、TMENUとしてTUGiを使っています。しかし、ときには純正のTMEN
Uを使いたい場合が有るわけです。このときに、REIPLしてしまってはRAMデ
ィスクの内容が全て消えてしまいます。REIPLせずに、TMENUを切り換える
方法は無いのでしょうか?
Oh!FM1991年7月号「INSIDE TOWNS CONTROL.EX
Eの秘密」に、メモリ上のCONTROL.EXEのテーブルを書き換えることによ
り、システムドライブを変更してしまうというプログラムSETMENU.COMが
載っています。これがぴったりなのですが、あいにくT-OS V1.1用です。V
2.1では動きそうもありません。
V2.1L10を起動し、SYMDEBでメモリ上のCONTROL.EXEを覗
いてみると、案の定、共通テーブルの内容がV1.1とはずいぶん違っているようで
す。int 0d9h によってESにセグメント値が返ってきますが(INTD9.COM
により調べられます)、そのセグメントのオフセット044fh,0450h,0451h,0bb5h,0c45h,
0c5ch,0c73h,0d0ah,0d29h,0d3dh にドライブ名らしい文字があります。CONTRO
L.EXEの起動時に
control -dI
のようにオプションを付けることにより起動ドライブ名を変更できますが、このよう
に起動ドライブを変更するとこのオフセットの部分が変化します。起動ドライブがD
:のときのこれらのオフセット位置にある文字列を次に示します。
044F:"DDD:\RUN386.EXE"
0BB5:"D:\RUN386.exe"
0C45:"D:\SYSINIT\SYSINIT.EXE"
0C5C:"D:\HCOPY\COCO_MEM.EXE"
0C73:"D:\TMENU.EXP"
0D0A:"D:\HCOPY\DELDRV.EXP FORRBIOS"
0D29:"D:\HCOPY\ADDDRV.EXP D:\HCOPY\FORRBIOS.NSD"
この他にオフセット0e1dh のデータが、起動ドライブA:,B:,C:,‥‥に応じ
て、0,1,2,‥‥と変化します。ここは、int 0d9h によってBXに返されるオ
フセット位置の1番地手前で、前記Oh!FMの記事によるとTMENU.EXPの
あるドライブ番号を意味しているようです。
ということで、メモリ上のCONTROL.EXEのこれらのドライブ情報を自由
に操作できるプログラムを作ってみました。それがCHGCONT.COMです。ド
ライブ情報のオフセット位置は、CONTROL.EXEのバージョンによって異な
るかもしれません。T-OS V2.1L10のCONTROL.EXEはint 0d9h
によってBXに 0e1eh が返ってきます。それで、int 0d9h によってこれ以外の値が
返ってきた場合は何もしないで終了するようにしました。まず、INTD9.COM
によって、int 0d9h の戻り値を確かめて下さい。INTD9.COMの出力例を示
します。
ES:BX = 48C7:0E1E
CHGCONT.COMは、10文字のパラメータにより前記10個のオフセット
位置のデータを書き換えます。また、オフセット0c73h のデータを示す7文字目のパ
ラメータに連動して、オフセット0e1dh のデータも書き換えます。
実際の使用法ですが、起動ドライブをD:として、RAMディスクをI:とします。
D:¥にはT-OS V2.1L10純正のTMENU.EXPを置いておきます。
起動時にTUGI.EXPをTMENU.EXPという名前でI:¥に転送しておき、
RUN386.EXEもI:¥に転送しておきます。次のようなバッチ
chgcont iiiiddiddd
i:
を実行すれば一瞬にしてTMENUとしてのTUGiが起動します。私はこのバッチ
をアイテム登録しています。また、純正のTMENUに戻りたいときは次のようなバ
ッチ
chgcont iiiidddddd
d:
を実行すれば良いのです。REIPLしていませんから起動は速いし、RAMディス
クの内容もそのままです。両者の間を何度でも往復できます。これは便利ですよ。も
っとも、切り換え頻度が頻繁でRAMディスク容量が十分に多いのであれば、両方と
もRAMディスクに転送しておいて、リネームするような切り換え方法の方が良いか
もしれませんが。
★T-OSV2.1L20用CHGCONT2.COMについて
T-OSV2.1L20A付属のCONTROL.EXEでは、int 0d9h の返り
値は、例えば
ES:BX = 48C7:1017
となり、ドライブ名のついた文字列は上のセングメントのオフセット値で
0446:"DDD:\RUN386.EXE"
0D17:"D:\RUN386.exe"
0D27:"D:\RUN386.exe"
0DB7:"D:\SYSINT\SYSINT.EXE"
0DCE:"D:\HCOPY\COCO_MEM.EXE"
0DE4:"D:\SIDEWORK\SIDEWORK.EXE"
0DFE:"D:\TMENU.EXP"
0E95:"D:\HCOPY\DELDRV.EXP FORRBIOS"
0EB4:"D:\HCOPY\ADDDRV.EXP D:\HCOPY\FORRBIOS.NSD"
0EE0:"D:\HCOPY\DELDRV.EXP SMG"
0EFA:"D:\HCOPY\ADDDRV.EXP D:\HCOPY\NSDD\SMSG.NSD"
となっています。
これら全部変更可能にしてもしょうがないし、バッチファイルが分かりにくくなる
だけですのでL20用は思いきって可変パラメータの数を減らして、0446h,0447h,
0448h,0d17h,0d27h,0dfeh のオフセット値の所だけにしました。
従って、L20でCHGCONT2を使う場合は、バッチファイル中で
chgcont2 iiiiii
i:
のようにして下さい。
★CHGENV.COMについて
T-OSでは全てがCONTROL.EXEの子プロセスとして起動されるので、
環境変数を変更しようとしてもやりにくいですよね。いったんCONTROL.EX
Eを終了させ、環境変数を変更して、再びCONTROL.EXEを起動しなければ
なりません。しかも、この一連の処理を1つのバッチファイル内で行うのは不可能で
す。
私は、何回もGCCを起動しなければならないときなどは、RAMディスクにGC
Cのシステムをそっくり転送して、環境変数PATHとGNUを変更して、RAMデ
ィスク上で開発を行おうと思い立ちました。しかし、環境変数の変更が意外と面倒で
うまくいきません。そこで、こうなったら最後の手段というわけで、CONTROL.
EXEの環境領域を書き換えてしまうというプログラムを作ってみました。
CHGENV.COMがそのプログラムです。動作は、いたって簡単、自分の環境
領域をCONTROL.EXEの環境領域にコピーするだけです。次のようなバッチ
中で使用します。
set PATH=I:\;I:\USR\BIN;D:\;D:\DOS;D:\MASM;D:\T_TOOL;G:\BAT;G:\SCOM
set GNU=I:
chgenv
つまり、環境変数の変更はCOMMAND.COMにお任せで、CHGENV.CO
Mは変更後の環境変数を環境領域もろともコピーするだけなのです。
CONTROL.EXEの環境領域は次のようにして求めています。int 0d9h に
よってESに返されるセグメント値はCONTROL.EXEのコードセグメントら
しいのでこの値から10h を引いてPSPアドレスを求めます。そのPSPのオフセッ
ト2ch,2dh が環境領域のセグメントアドレスです。
このプログラムによってGCCもRAMディスク上で快適に動くようになり、ハー
ドディスクのアクセスランプもほとんど点灯しなくなりました。めでたし、めでたし。
注意点が2つ有ります。CHGENV.COMは自分の環境領域をそっくりオーナ
ー名まで含めてコピーしてしまうので、VMAP.COM等のメモリ表示ツールで表
示させると、CONTROL.EXEのはずの所がCHGENV.COMになってし
まいます。まあ、気にしないで下さい。
それから、CHGENVはCONTROL.EXEの環境領域を変更しますから、
例えば、エディタVzを起動してエディタから前記のようなバッチを実行してもVz
の環境変数は変更できません。Vzの起動前にバッチを実行して下さい。
なお、このプログラムを使用していて一度だけメモリアロケーションエラーが出て
ハングアップ状態になったことがあります。MCBを壊したのだと思いますが原因は
不明です。
★ソースリスト*.ASMについて
ソースリストは一応MASM V4.0用なのですが、独自のインクル-ドファイ
ルと構造化マクロを使用しているため、そのままではアセンブル出来ません。(類似
の構造化マクロやMASM6を使用したりすれば移植は容易だと思います。)
リスト2のif_文等で使われている関係子は、条件付き分岐命令(jaやjbe)
のjに続く文字と同じ意味を持っています。例えば、
<al ae 'A'> * <al be 'Z'>
は、C言語で記述すれば次のようになります。
(al >= 'A') && (al <= 'Z')
"*"はANDで、"+"はORの意味です。